#[derive(Debug, Clone, Copy)]
struct Book {
    count: i32, // 存放在栈中,已实现Copy
    page: i32,  // 存放在栈中,已实现Copy
                // name:String  // 存放在堆中，需手动实现copy
}

fn main() {
    // box
    // box_number 指向在堆中的内存地址
    let mut box_number = Box::new(10);
    // move 移交所有权
    // let box_number_move = box_number;
    // println!("box_number:{}", box_number);  // error
    // clone
    let box_number_clone = box_number.clone();
    println!("box_number:{}", box_number);
    println!("box_number_clone:{}", box_number_clone);

    *box_number += 10;
    println!("box_number:{}", *box_number);

    // vec
    let vec_number = vec![1, 2, 3];
    // move 移交所有权
    // let vec_number_move = vec_number;
    // println!("vec_number:{:?}", vec_number);  //error
    // clone
    let vec_number_move = vec_number.clone();
    println!("vec_number:{:?}", vec_number);
    println!("vec_number:{:?}", vec_number_move);

    // String
    let string_abc = String::from("abc");
    // move 移交所有权
    // let string_abc_move = string_abc;
    // println!("string_abc:{}", string_abc);  // error
    // clone
    let string_abc_clone = string_abc.clone();
    println!("string_abc:{}", string_abc);
    println!("string_abc_clone:{}", string_abc_clone);

    let b1 = Book { count: 5, page: 10 };
    // #[derive(Debug)] 时为 move 移交所有权，b1销毁；
    // #[derive(Debug, Clone, Copy)] 不移交所有权，b1仍存在
    let b2 = b1;
    println!("b1:{:?}", b1)


    // 栈中为借用，变量a仍然存在
    // let a = 10;
    // let mut b = a;
    // println!("a:{}", a);
    // println!("b:{}", b);
    // b = 20;
    // println!("a:{}", a);
    // println!("b:{}", b);
}
